/**
 * lang = zh-CN | zh-TW | en
 */
const lang = (typeof window.gon !== 'undefined' && window.gon.locale) || 'en';

const defaultMessages = {
  en: {
    default: 'Validation error on field %s',
    required: '%s is required',
    enum: '%s must be one of %s',
    whitespace: '%s cannot be empty',
    date: {
      format: '%s date %s is invalid for format %s',
      parse: '%s date could not be parsed, %s is invalid ',
      invalid: '%s date %s is invalid',
    },
    types: {
      string: '%s is not a string',
      method: '%s is not a method (function)',
      array: '%s is not an array',
      object: '%s is not an object',
      number: '%s is not a number',
      date: '%s is not a date',
      boolean: '%s is not a boolean',
      integer: '%s is not an integer',
      float: '%s is not a float',
      regexp: '%s is not a valid regexp',
      email: '%s is not a valid email',
      url: '%s is not a valid url',
      hex: '%s is not a valid hex',
    },
    string: {
      len: '%s must be exactly %s characters',
      min: '%s must be at least %s characters',
      max: '%s cannot be longer than %s characters',
      range: '%s must be between %s and %s characters',
    },
    number: {
      len: '%s must equal %s',
      min: '%s cannot be less than %s',
      max: '%s cannot be greater than %s',
      range: '%s must be between %s and %s',
    },
    array: {
      len: '%s must be exactly %s in length',
      min: '%s cannot be less than %s in length',
      max: '%s cannot be greater than %s in length',
      range: '%s must be between %s and %s in length',
    },
    pattern: {
      mismatch: '%s is invalid',
    },
  },
  'zh-CN': {
    default: '%s验证失败',
    required: '%s为必填项',
    enum: '%s必须为 %s 其中之一',
    whitespace: '%s不能为空',
    date: {
      format: '%s格式不正确',
      parse: '%s格式不正确',
      invalid: '%s格式不正确',
    },
    types: {
      string: '%s必须是一个字符串',
      method: '%s必须是个函数',
      array: '%s不是一个数组',
      object: '%s不是一个对象',
      number: '%s不是数字类型',
      date: '%s不是一个日期',
      boolean: '%s不是布尔类型',
      integer: '%s不是一个证书',
      float: '%s不是浮点类型',
      regexp: '%s不是一个正则表达式',
      email: '%s格式不正确',
      url: '%s不是正确的 URL 地址',
      hex: '%s不是正确的十六进制数',
    },
    string: {
      len: '%s必须是 %s 个字符',
      min: '%s最少 %s 个字符',
      max: '%s最多 %s 个字符',
      range: '%s的长度必须是 %s-%s 位',
    },
    number: {
      len: '%s必须等于 %s',
      min: '%s最小值 %s',
      max: '%s最大值为 %s',
      range: '%s的值的区间为 %s-%s',
    },
    array: {
      len: '%s的必须为 %s 个',
      min: '%s最少为 %s 个',
      max: '%s最多为 %s 个',
      range: '%s的长度为 %s-%s 个',
    },
    pattern: {
      mismatch: '%s的格式不正确',
    },
  },
  'zh-TW': {
    default: '%s驗證失敗',
    required: '%s為必填項',
    enum: '%s必須為 %s 其中之壹',
    whitespace: '%s不能為空',
    date: {
      format: '%s格式不正確',
      parse: '%s格式不正確',
      invalid: '%s格式不正確',
    },
    types: {
      string: '%s必須是壹個字符串',
      method: '%s必須是個函數',
      array: '%s不是壹個數組',
      object: '%s不是壹個對象',
      number: '%s不是數字類型',
      date: '%s不是壹個日期',
      boolean: '%s不是布爾類型',
      integer: '%s不是壹個證書',
      float: '%s不是浮點類型',
      regexp: '%s不是壹個正則表達式',
      email: '%s格式不正確',
      url: '%s不是正確的 URL 地址',
      hex: '%s不是正確的十六進制數',
    },
    string: {
      len: '%s必須是 %s 個字符',
      min: '%s最少 %s 個字符',
      max: '%s最多 %s 個字符',
      range: '%s的長度必須是 %s-%s 位',
    },
    number: {
      len: '%s必須等於 %s',
      min: '%s最小值 %s',
      max: '%s最大值為 %s',
      range: '%s的值的區間為 %s-%s',
    },
    array: {
      len: '%s的必須為 %s 個',
      min: '%s最少為 %s 個',
      max: '%s最多為 %s 個',
      range: '%s的長度為 %s-%s 個',
    },
    pattern: {
      mismatch: '%s的值 %s 和正則 %s 不匹配',
    },
  },
};

const getMessages = () => defaultMessages[lang];

export function newMessages() {
  return {
    ...getMessages(),
    clone() {
      const cloned = JSON.parse(JSON.stringify(this));
      cloned.clone = this.clone;
      return cloned;
    },
  };
}

export const messages = newMessages();
